package cn.sunzq.springdata.elasticsearch.demo.querydemo.service;

import cn.sunzq.springdata.elasticsearch.demo.document.TempLincolnshireDocument;

import java.util.List;
import java.util.Map;

/**
 * @创建人 孙中泉
 * @创建时间 2021/7/27
 * @描述
 */
public interface TempLincolnshireDemoService {

    /**
     *@描述 criteria查询示例1: 完全匹配单个name和单个year，并支持分页
     *@参数 [name, year, pageNo, pageSize]
     *@返回值 java.util.List<cn.sunzq.springdata.elasticsearch.demo.document.TempLincolnshireDocument>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<TempLincolnshireDocument> criteriaQuery1(String name, String year, Integer pageNo, Integer pageSize);

    /**
     *@描述 criteria查询示例2: 多个name满足其一，且多个year满足其一，并支持分页
     *@参数 [name, year, pageNo, pageSize]
     *@返回值 java.util.List<cn.sunzq.springdata.elasticsearch.demo.document.TempLincolnshireDocument>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<TempLincolnshireDocument> criteriaQuery2(List<String> name, List<String> year, Integer pageNo, Integer pageSize);

    /**
     *@描述 criteria查询示例2: 在name和year中同时搜索关键字，满足其一，并支持分页
     *@参数 [keyword, pageNo, pageSize]
     *@返回值 java.util.List<cn.sunzq.springdata.elasticsearch.demo.document.TempLincolnshireDocument>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<TempLincolnshireDocument> criteriaQuery3(String keyword, Integer pageNo, Integer pageSize);

    /**
     *@描述 stringQuery示例查询1： 完全匹配单个name和单个year，并支持分页，与criteriaQuery1条件相同
     *@参数 [name, year, pageNo, pageSize]
     *@返回值 java.util.List<cn.sunzq.springdata.elasticsearch.demo.document.TempLincolnshireDocument>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<TempLincolnshireDocument> stringQuery1(String name, String year, Integer pageNo, Integer pageSize);

    /**
     *@描述 restClient示例1：基于Rest High Level Client 实现与criteriaQuery1条件相同的查询
     *@参数 [name, year, pageNo, pageSize]
     *@返回值 java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<Map<String,Object>> restClient1(String name, String year, Integer pageNo, Integer pageSize);

    /**
     *@描述 聚合示例1： 完全匹配单个name和year的数据中，按hours分组得到每个分组下的数据条数
     *@参数 [name, year]
     *@返回值 java.util.Map<java.lang.String,java.lang.Object>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    Map<String,Object> aggDemo1(String name, String year);

    /**
     *@描述 聚合示例2： 完全匹配单个name和year的数据中，分别按hours和month分组，并得到hours和month两个分组每个分组下的数据条数
     *@参数 [name, year]
     *@返回值 java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<Map<String,Object>> aggDemo2(String name, String year);

    /**
     *@描述 聚合示例3： 完全匹配单个name和year的数据中，分别按hours和month分组，并得到hours和month两个分组每个分组下的平均数
     *@参数 [name, year]
     *@返回值 java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<Map<String, Object>> aggDemo3(String name, String year);

    /**
     *@描述 聚合示例4： 完全匹配单个name和year的数据中，分别按hours和month分组，并得到hours和month两个分组每个分组下，value按参数传递的数据范围进行再分组，得到二层分组下的数据条数
     *@参数 [name, year, valueGroup]
     *@返回值 java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<Map<String,Object>> aggDemo4(String name, String year, List<Double> valueGroup);

    /**
     *@描述 聚合案例5： 时间范围在参数传递的范围内，并得到按年、月、日、时四个分组依次向下四层结构，得到每个小时的value平均值
     *@参数 [name, dateRange]
     *@返回值 java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     *@创建人 孙中泉
     *@创建时间 2021/7/28
     *@修改人和其它信息
     */
    List<Map<String, Object>> aggDemo5(String  dateRangeStart, String dateRangeEnd);

    /**
     *@描述 聚合案例6： 时间范围在参数传递的范围内，得到按名称或者月份分组，得到分组下升序或降序时前几位value的平均值
     *@参数 [dateRangeStart, dateRangeEnd, topNo, isAsc, aggField]
     *@返回值 java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     *@创建人 孙中泉
     *@创建时间 2021/7/29
     *@修改人和其它信息
     */
    List<Map<String,Object>> aggDemo6(String dateRangeStart, String dateRangeEnd, int topNo, boolean isAsc, String aggField);

}
